home *** CD-ROM | disk | FTP | other *** search
-
- { Fill in the message bytes of the current
- Track Event in a Track Data Block
- }
- procedure track_event_message(var tdt:track_data_block);
- var
- i : byte; { index counter }
- label
- return;
- begin
- with tdt.curr do
- begin
- case this_byte(tdt) of
- NOP, MEASURE_END, DATA_END:
- begin
- event_type:=MARK;
- if (this_byte(tdt) = DATA_END) then
- tdt.edat:=true;
- event.mess[event_len]:=this_byte(tdt);
- event_len:=event_len+1;
- advance(tdt);
- goto return;
- end;
- 128..239: { MIDI status byte }
- begin
- running_status:=this_byte(tdt);
- event_type:=MIDI_RS;
- event.mess[event_len]:=this_byte(tdt);
- event_len:=event_len+1;
- advance(tdt);
- end;
- else
- event_type:=MIDI;
- end; { case }
-
- { fill in MIDI data bytes }
- for i:=1 to nmdat(tdt.curr.running_status) do
- begin
- event.mess[event_len]:=this_byte(tdt);
- event_len:=event_len+1;
- advance(tdt);
- end;
- end; { with tdt.curr }
- return:
- end;
-
- { Advance to the next Track Event in a Track Data Block
- }
- procedure next_track_event(var tdt:track_data_block);
- label
- return;
- begin
- if (tdt.edat) then { end of data }
- goto return;
- with tdt.curr do
- begin
- event_len:=1; { count event time }
- case this_byte(tdt) of
- TIMING_OVERFLOW:
- begin
- event_type:=OVFL;
- event.time:=MAX_TIMING_COUNT;
- advance(tdt);
- goto return;
- end;
- 0..239: { timing byte }
- begin
- event.time:=this_byte(tdt);
- advance(tdt);
- track_event_message(tdt);
- end;
- end; { case }
- end; { with tdt.curr }
- return:
- end;
-
- { Store a Track Event in a designated Track Data Block
- }
- procedure store_track_event(var tdo:track_data_block;
- eblk:track_event_block);
- var
- i : byte; { index counter }
- begin
- case eblk.event.time of
- MAX_TIMING_COUNT:
- begin
- tdo.tds[tdo.tds_ptr]:=TIMING_OVERFLOW;
- advance(tdo);
- end;
- 0..239:
- begin
- tdo.tds[tdo.tds_ptr]:=eblk.event.time;
- advance(tdo);
- for i:=1 to eblk.event_len - 1 do
- begin
- tdo.tds[tdo.tds_ptr]:=eblk.event.mess[i];
- advance(tdo);
- end;
- end;
- end; { case }
- end;
-
- { Display a track event on the user console
- }
- procedure disp_event(eblk:track_event_block);
- var
- i : byte; { index counter }
- label return;
- begin
- with eblk do
- begin
- write(event.time:4);
- if (event_len = 1) then
- begin
- write(' Timing Overflow':16);
- goto return;
- end;
- if (event.mess[1] in [NOP,MEASURE_END,DATA_END]) then
- begin
- case event.mess[1] of
- NOP :
- begin
- write('NOP':16);
- goto return;
- end;
- MEASURE_END:
- begin
- write('Measure End':16);
- goto return;
- end;
- DATA_END:
- begin
- write('Data End':16);
- goto return;
- end;
- end; {case}
- end; {if}
- i:=1;
- if (midi_status(event.mess[1])) then
- begin
- write(MIDI_MESS_TEXT[midi_cmnd(event.mess[1])]:16);
- i:=i+1;
- end
- else
- write(' ':16);
- while (i <= (event_len - 1)) do
- begin
- write(event.mess[i]:4);
- i:=i+1;
- end;
- end; { with eblk }
- return:
- writeln;
- end;
-
- { Display all of the Track Events in a Track Data Block
- }
- procedure disp_track_data(var tdt:track_data_block);
- var
- time : real; { Actual time of current track event }
- begin
- time:=0.0;
- reset_track_data(tdt);
- while not(tdt.edat) do
- begin
- next_track_event(tdt);
- time:=time+tdt.curr.event.time;
- write( ((time*60)/(TIMEBASE*TEMPO)):8:3 );
- disp_event(tdt.curr);
- end;
- end;
-
- );
- time:=time+tdt.curr.event.time;
- write( ((time*60)/(TIMEBASE*TEMPO)):8:3 );
- disp_even